package client

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"gin-epg/internal/app/dao"
	"gin-epg/internal/app/entity"
	"github.com/go-resty/resty/v2"
	"strconv"
	"time"
)

/*
频道列表
导视服务        4200000237
CCTV-1综合高清        4200000166
山东卫视高清        4200000150
济南新闻高清        4200000331
济南都市高清        4200000486
济南文旅体育        4200000487
济南娱乐        4200000488
济南生活高清        4200000489
济南鲁中        4200000490
济南少儿        4200000491
聚鲨环球精选        4200000358
家有购物        4200000065
优购物        4200000395
山东教育卫视高清        4200001038
齐鲁频道高清        4200000245
山东文旅高清        4200000399
山东体育高清        4200000292
山东生活高清        4200000400
山东综艺高清        4200000401
山东少儿高清        4200000026
山东新闻高清        4200000291
山东农科高清        4200000025
ETV-济南教育        4200000492
居家购物高清        4200000147
家家购物        4200000038
时尚购物        4200000194
济南导视频道        4200000901
CCTV-2经济高清        4200000261
CCTV-3综艺高清        4200000198
CCTV-4中文国际高清        4200000228
CCTV-5体育高清        4200000199
CCTV-5+体育赛事高清        4200000160
CCTV-6电影高清        4200000200
CCTV-7国防军事高清        4200000262
CCTV-8电视剧高清        4200000203
CCTV-9纪录高清        4200000263
CCTV-10科教高清        4200000264
CCTV-11戏曲高清        4200000402
CCTV-12社会与法高清        4200000265
CCTV-13新闻高清        4200000019
CCTV-14少儿高清        4200000266
CCTV-15音乐高清        4200000138
CCTV-16奥林匹克高清        4200001057
CCTV-17农业农村高清        4200000485
好享购物        4200000148
央广购物        4200000255
风尚购物        4200000295
CCTV-中视购物        4200000076
北京卫视高清        4200000154
浙江卫视高清        4200000152
天津卫视高清        4200000260
湖南卫视高清        4200000155
江苏卫视高清        4200000151
安徽卫视高清        4200000257
东方卫视高清        4200000153
黑龙江卫视高清        4200000156
辽宁卫视高清        4200000258
深圳卫视高清        4200000158
湖北卫视高清        4200000252
四川卫视高清        4200000271
河南卫视高清        4200000226
河北卫视高清        4200000272
贵州卫视高清        4200000273
江西卫视高清        4200000289
重庆卫视高清        4200000259
吉林卫视高清        4200000288
陕西卫视        4200000115
云南卫视高清        4200000140
山西卫视        4200000112
东南卫视高清        4200000274
广东卫视高清        4200000157
广西卫视        4200000125
内蒙古卫视        4200000131
宁夏卫视        4200000114
甘肃卫视        4200000118
青海卫视高清        4200000130
海南卫视高清        4200000141
济铁频道        4200000959
新疆卫视        4200000143
西藏卫视        4200000142
兵团卫视        4200000144
农林卫视        4200000359
金鹰卡通        4200000135
BRTV纪实科教        4200000223
BTV-卡酷少儿        4200000122
央视文化精品        4200001002
中国天气        4200000062
中国教育1高清        4200000287
CCTV-兵器科技        4200000241
CCTV-世界地理        4200000096
CCTV-发现之旅        4200000079
老故事        4200000081
CCTV-央视文化精品        4200000089
CCTV-怀旧剧场        4200000092
CCTV-第一剧场        4200000095
CCTV-风云剧场        4200000094
CCTV-风云音乐        4200000091
CCTV-女性时尚        4200000078
新科动漫        4200000106
CCTV-高尔夫·网球4200000328
CCTV-风云足球        4200000093
CETV-4        4200000493
先锋乒羽        4200000074
CCTV-12 标清        4200001092
武术世界        4200001218
四海钓鱼        4200000057
快乐垂钓高清        4200000243
车迷频道        4200000050
汽摩        4200000099
天元围棋        4200000105
百姓健康        4200000530
CCTV-电视指南HD        4200001206
生态环境        4200000053
生活 时尚        4200000563
嘉佳卡通        4200000256
优漫卡通        4200000239
哈哈炫动        4200000238
梨园频道高清        4200001216
七彩戏剧        4200000044
金色学堂        4200000045
收藏天下        4200000048
书画        4200000082
乐游频道        4200000471
环球奇观        4200000077
环球旅游        4200000052
CCTV-央视台球        4200000253
优优宝贝        4200000051
茶频道高清        4200000097
摄影频道        4200000090
财富天下        4200000066
家庭理财        4200000061
东方财*        4200000032
中华美食        4200000073
国学频道        4200000108
早期教育        4200000083
高三专题辅导        4200000892
CGTN-种养国际        4200000329
英语辅导        4200000087
CHC高清电影频道        4200000071
CHC动作电影频道        4200000070
CHC家庭影院频道        4200000069
历城新闻        4200000502
测试1        4200000411
测试2        4200000412
CCTV-电视指南        4200000102
*/

// 山东有线 频道名称映射
var mapSdyx = map[string]string{
	"4200000166": "CCTV1",
	"4200000154": "北京卫视4K",
	"4200000125": "广西卫视",
	"4200000150": "山东卫视",
	"4200000025": "山东农科",
	"4200000026": "山东少儿",
	"4200000237": "山东导视",
	"4200000291": "山东新闻",
	"4200000292": "山东体育休闲",
	"4200000399": "山东文旅",
	"4200000400": "山东生活",
	"4200000401": "山东综艺",
	"4200001038": "山东教育卫视",
	"4200000331": "济南新闻",
	"4200000486": "济南都市",
	"4200000487": "济南文旅体育",
	"4200000488": "济南娱乐",
	"4200000489": "济南生活",
	"4200000490": "济南鲁中",
	"4200000491": "济南少儿",
	"4200000492": "ETV-济南教育",
	"4200000901": "济南导视",
	// 更多键值对...
}

// 全部频道列表接口 curl --location 'https://slave-zz.sdcabletv.cn:4443/media/channel/get_list?sortby=0&label=0&accesstoken=R641BB529U30980006K7735AE6CI703D5672PBM339DA0DV20A42Z5A5B5W174EEA694A9C5DE9&pagenum=9999&pageidx=1&postersize=90x90&pfflag=1'
// HandleSdyxCron 处理 山东有线 节目单
func HandleSdyxCron(beforeDay, afterDay int) error {
	dao.Logger.Infof("HandleSdyxCron start")
	source := "sdyx"

	client := resty.New()
	for key, value := range mapSdyx {
		dao.Logger.Infof("Key: %s, Value: %s", key, value)
		for dayOffset := -beforeDay; dayOffset <= afterDay; dayOffset++ {
			date := time.Now().AddDate(0, 0, dayOffset).Format("2006-01-02")
			dao.Logger.Infof(date)

			startTime := strconv.FormatInt(getDayFirstSecond(date), 10)
			endTime := strconv.FormatInt(getDayLastSecond(date), 10)
			url := fmt.Sprintf("https://slave-zz.sdcabletv.cn:4443/media/event/get_list?chnlid=%s&pageidx=1&vcontrol=0&attachdesc=1&repeat=1&accesstoken=R5F2408FEU3198804BK78052214IE73560DFP2BF4M340CE68V0Z339CBW1626D4D261E46FEA&starttime=%s&endtime=%s&pagenum=100&flagposter=0", key, startTime, endTime)

			resp, err := client.R().
				SetHeaders(map[string]string{
					"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
				}).
				Get(url)

			if err != nil {
				return fmt.Errorf("failed to get data from URL: %v", err)
			}

			var data map[string]interface{}
			if err := json.Unmarshal(resp.Body(), &data); err != nil {
				return fmt.Errorf("failed to unmarshal JSON: %v", err)
			}

			if eventList, ok := data["event_list"].([]interface{}); ok {
				// 获取当前日期范围内的已有节目记录
				db := dao.SqlSession
				dateParsed, _ := time.Parse("2006-01-02", date)
				var existingRecords []entity.EpgProgramCollect
				if err := db.Where(&entity.EpgProgramCollect{Channel: value, Date: entity.NullDate{sql.NullTime{Time: dateParsed, Valid: true}}, Source: source}).Find(&existingRecords).Error; err != nil {
					dao.Logger.Errorf("failed to get existing records: %v", err)
					continue
				}

				existingMap := make(map[string]*entity.EpgProgramCollect)
				for i := range existingRecords {
					existingMap[existingRecords[i].Start] = &existingRecords[i]
				}

				var newPrograms, updatePrograms, deletePrograms []entity.EpgProgramCollect

				for _, event := range eventList {
					eventMap := event.(map[string]interface{})
					startDate := int64(eventMap["start_time"].(float64))
					momentStartDate := time.Unix(startDate, 0)
					stopDate := int64(eventMap["end_time"].(float64))
					momentStopDate := time.Unix(stopDate, 0)

					channel := value
					dateStr := momentStartDate.Format("2006-01-02")
					start := momentStartDate.Format("15:04")
					stop := momentStopDate.Format("15:04")

					if channel != "" && dateStr != "" && start != "" && stop != "" {
						if dateStr == date {
							title := eventMap["event_name"].(string)
							desc := eventMap["desc"].(string)

							if existingRecord, ok := existingMap[start]; ok {
								if existingRecord.Title != title || existingRecord.End != stop {
									existingRecord.Title = title
									existingRecord.Desc = desc
									existingRecord.End = stop
									existingRecord.UpdateTime = entity.NullTime{sql.NullTime{Time: time.Now(), Valid: true}}
									updatePrograms = append(updatePrograms, *existingRecord)
								}
								delete(existingMap, start)
							} else {
								newRecord := entity.EpgProgramCollect{
									Title:      title,
									Desc:       desc,
									Source:     source,
									Channel:    channel,
									Date:       entity.NullDate{sql.NullTime{Time: dateParsed, Valid: true}},
									Start:      start,
									End:        stop,
									CreateTime: entity.NullTime{sql.NullTime{Time: time.Now(), Valid: true}},
								}
								newPrograms = append(newPrograms, newRecord)
							}
						}
					}
				}

				// 处理需要删除的记录
				for _, record := range existingMap {
					deletePrograms = append(deletePrograms, *record)
				}

				// 执行数据库操作
				if len(updatePrograms) > 0 {
					for _, program := range updatePrograms {
						if err := db.Model(&program).Updates(entity.EpgProgramCollect{Title: program.Title, Desc: program.Desc, End: program.End, UpdateTime: program.UpdateTime}).Error; err != nil {
							dao.Logger.Errorf("update error: %v", err)
						} else {
							dao.Logger.Debugf("update success: %v", program)
						}
					}
				}

				if len(newPrograms) > 0 {
					for _, program := range newPrograms {
						if err := db.Create(&program).Error; err != nil {
							dao.Logger.Errorf("insert error: %v", err)
						} else {
							dao.Logger.Debugf("insert success: %v", program)
						}
					}
				}

				if len(deletePrograms) > 0 {
					for _, program := range deletePrograms {
						if err := db.Delete(&program).Error; err != nil {
							dao.Logger.Errorf("delete error: %v", err)
						} else {
							dao.Logger.Debugf("delete success: %v", program)
						}
					}
				}
			}
		}
	}
	return nil
}
